<?php

/**
 * Фабрика валидаторов.
 *
 */
abstract class Kernel_Validator_Factory {

    /**
     * Возвращает валидатор по указанному определению.
     *
     * @param   mixed   $definition
     * @return  Kernel_Validator_Abstract
     */
    static public function create($definition) {

        switch (gettype($definition)) {

            // если указана строка, то это и есть наименование валидатора
            case 'string':
                $name = $definition;
                $params = array();
                break;

            // если массив, то первый элемент - наименование, второй - параметры
            case 'array':
                $name = array_shift($definition);
                $params = (array)array_shift($definition);
                break;

            // других типов не понимаем
            default:
                trigger_error('Unsuppoted validator definition type', E_USER_ERROR);
                break;
        }
        $class = self::_getClassName($name);
        return new $class($params);
    }

    /**
     * Возвращает наименование класса.
     *
     * @param   string  $name
     * @return  string
     */
    static private function _getClassName($name) {
        // если указано имя валидатора, значит это стандартный
        return false === strpos($name, '_')
            ? 'Kernel_Validator_' . str_camelize($name) : $name;
    }
}
